Service是一個我覺得很特別且在寫Android的路上將會有很多機會出場的一個重要工具,尤其是當app的規模越大的時候,一定會考慮讓他出場。
Service可以說是 Android 中一種獨特的 Thread,是一個在背景執行的服務。主要用於某些特定功能在APP離開前景後仍需要執行時,這時候就輪到Service上場拉~!!
由於Service的使用取決於功能和程式設計師的想法,所以我今天就以怎麼使用和讓各位知道和如何運作為主。
建立一個class繼承類別Service,裡面包含Service的生命週期和想在背景執行的方法。
public class MyService extends Service {
private final String TAG = "Service";
public class MyBinder extends Binder //宣告一個繼承 Binder 的類別 LocalBinder
{
MyService getService()
{
return MyService.this;
}
}
public void test(){
Log.e(TAG, "Service 測試方法");
}
private MyBinder myBinder = new MyBinder();
@Override
public void onCreate()
{
super.onCreate();
Log.e(TAG, "Service Create" );
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
// TODO Auto-generated method stub
Log.e("onStartCommand", "Service onStartCommand" );
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent)
{
Log.e(TAG, "Service Unbind" );
return super.onUnbind(intent);
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.e(TAG, "Service Destroy" );
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "Service Bind" );
return myBinder;
}
}
與activity標籤概念相同,沒新增就無法使用喔!!
<service android:name=".MyService" android:enabled="true" />
我設計了五個按鈕分別對應到Service的五個不同情況。
啟動Service。
startService_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, MyService.class);
//開始Service,進入生命週期onCreate、onStartCommand
startService(intent);
}
});
呼叫startService(Intent)啟動Service,此時會進入Service的生命週期onCreate()和onStartCommand(),沒有啟動Service就不會開始在背景執行喔,**onStartCommand()**是startService()才會進的的關鍵生命週期喔!
停止Service。
stopService_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, MyService.class);
//停止Service,進入生命週期onDestroy
stopService(intent);
}
});
呼叫stopService(Intent)停止Service,此時會進入Service的生命週期onDestroy(),把Service銷毀。
ServiceConnection
負責接收Service生命週期中的onUnbind()和onBind()的回調,也是Service和Activity溝通的橋樑。
public ServiceConnection serviceConnection = new ServiceConnection() {
//IBinder 由Service中onBind直接回傳
public void onServiceConnected(ComponentName className, IBinder binder) {
Log.e("onServiceConnected", "Service連線" );
myService = ((MyService.MyBinder) binder).getService();
}
public void onServiceDisconnected(ComponentName className) {
Log.e("onServiceConnected", "Service斷線" );
myService = null;
}
};
與Service綁定。
bindService_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, MyService.class);
//綁定才能呼叫Service的Function,進入生命週期onCreate、onBind
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
});
呼叫bindService(Intent,ServiceConnection,Context)與Service綁定,此時會進入Service的生命週期onCreate()、onBind(),完成綁定後才能獲取Service物件,也才能使用Service中的Function,**onBind()**是bindService()才會進的的關鍵生命週期喔!
與Service解除綁定。
unBindService_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//解除Service綁定,進入生命週期onUnbind、onDestroy
unbindService(serviceConnection);
}
});
呼叫unbindService(ServiceConnection)與Service解除綁定,此時會進入Service的生命週期onUnbind()、onDestroy(),**onUnbind()**是unbindService()才會進的的關鍵生命週期喔!
注意: 從上面看起來onCreate()和onDestroy()會重複的進入,但事實並非如此,比如我呼叫startService()接者呼叫bindService(),Service中的onCreate()是只會進一次的,onDestroy()亦同。
serviceFunction_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//呼叫Service 方法
myService.test();
}
});
最後,使用Service中的方法就可以使用Service物件呼叫在Service中的方法即可囉~
經過以上操作可以去開發人員選項->正在運作的服務中確認Service是否正在運作喔。如下
有這樣的畫面就代表啟用成功了喔~而如果使用stopService()的話,正在運作的服務中的app就會消失了喔。